package com.glodon.paas.document.storage.directory;

import java.io.IOException;
import java.io.InputStream;

import com.glodon.paas.document.storage.id.ObjectResult;

public interface Directory {
    String NOZ = "noz";
    String OBJECT_PREFIX = "object";
    String PART_PREFIX = "part";

    ObjectResult save(InputStream is) throws IOException;

    boolean has(String id) throws IOException;

    InputStream get(String id) throws IOException;

    /**
     * 初始化分块上传
     * 
     * @return partId, 唯一确定当前的分块上传，在后续上传时，需要传递。
     * @throws IOException
     */
    String initPart() throws IOException;

    /**
     * 分块上传
     * 
     * @param partId 初始化分块上传返回的 partId
     * @param partNumber TODO
     * @param state 上一次断点上传返回的状态
     * @param is 上传的文件流，读到流结束
     * @param length 上传的字节数，少于这个数量，报错
     * @return 返回本次上传的状态，长度和 ObjectId
     */
    ObjectResult append(String partId, int partNumber, String state, InputStream is, long length) throws IOException;

    /**
     * 结束分块上传
     * 
     * @param partId 始化分块上传返回的 partId
     * @param objectId 最后一次上传返回的 objectId
     */
    void complete(String partId, String objectId) throws IOException;

    InputStream get(String id, long start) throws IOException;

    void abortPart(String partId) throws IOException;

}
